package logica_de_negocio;

import java.util.HashSet;

import logica_de_datos.GestorBD;
import comun.PeliculaVistaNoSi;
import comun.ValorId_p;

public class gestorPeliculaVistaNoSi {

	private HashSet<PeliculaVistaNoSi> gpvns;
	final GestorBD objConversor = GestorBD.getInstance();

	public gestorPeliculaVistaNoSi() {

		gpvns = new HashSet<PeliculaVistaNoSi>();

	}

	public void cargarDatos() throws ClassNotFoundException {

	
			objConversor.connect();
			gpvns = objConversor.listarPeliculaVistaNoSi();
			objConversor.disconnect();

	}
	/**
	 * 
	 * @param pvns
	 * @throws excepAnadirDupli
	 * @throws FaltanDatosEnLaBaseDeDatos
	 * @throws ClassNotFoundException Se produce cuando no existe la base de datos
	 */
	public void addPeliculaVistaNoSi(PeliculaVistaNoSi pvns)
			throws excepAnadirDupli, FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {
		cargarDatos();
		if (gpvns.contains(pvns)) {
			excepAnadirDupli dupli = new excepAnadirDupli();
			dupli.setDes("La Pelicula con id " + pvns.getId_p()
					+ "  ya esta marcado como visto o no visto");
			throw dupli;
		} else {
			comprovarpVNS(pvns);

				objConversor.connect();
				objConversor.addPeliculaVistaNoSi(pvns);
				objConversor.disconnect();

		}
	}
	/**
	 * 
	 * @param pvns
	 * @throws FaltanDatosEnLaBaseDeDatos
	 * @throws ClassNotFoundException Se produce cuando no existe la base de datos
	 */
	private void comprovarpVNS(PeliculaVistaNoSi pvns)
			throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {
		/**
		 * Comprueba que tanto en id del usuario como el de la pelicula esten en
		 * la base de datos
		 */

		boolean estaP = false;
		gestorPeli gp = new gestorPeli();
		if (gp.isId(pvns.getId_p())) {
			estaP = true;
		}
		boolean estaU = false;
		gestorUsuario gu = new gestorUsuario();
		if (gu.isId(pvns.getId_u())) {
			estaU = true;
		}
		if ((estaP == false) || (estaU == false)) {
			FaltanDatosEnLaBaseDeDatos ex = new FaltanDatosEnLaBaseDeDatos();
			if (estaP == false) {
				ex.setFalta("Falta el id de la pelicula ");
			}
			if ((estaU == false) && (estaP == false)) {
				ex.setFalta(ex.getFalta() + " y ");
			}
			if (estaU == false) {
				if (ex.getFalta() == null) {
					ex.setFalta("Falta el id del usuario ");
				} else {
					ex.setFalta(ex.getFalta() + "falta el id del usuario ");
				}

			}
			ex.setFalta(ex.getFalta() + "en la Base De datos");
			throw ex;
		}
	}

	public boolean modificarPeliculaVistaNoSi(PeliculaVistaNoSi pvns) throws ClassNotFoundException {

		cargarDatos();
		boolean dev = false;
		if (gpvns.contains(pvns)) {
		
				objConversor.connect();
				objConversor.modifyPeliculaVistaNoSi(pvns);
				dev = true;
				objConversor.disconnect();

		}
		return dev;
	}

	public boolean deleteAllPeliculaVistaNoSiFromId_U(int id_u) throws ClassNotFoundException {

		boolean dev = false;
		if (isId_u(id_u)) {
	
				objConversor.connect();
				objConversor.deletePeliculaVistaNoSiFormId_u(id_u);
				dev = true;
				objConversor.disconnect();

		}
		return dev;
	}

	public boolean deleteAllPeliculaVistaNoSiFromId_P(int id_p) throws ClassNotFoundException {

		boolean dev = false;
		if (isId_p(id_p)) {
	
				objConversor.connect();
				objConversor.deletePeliculaVistaNoSiFromId_p(id_p);
				dev = true;
				objConversor.disconnect();

		}
		return dev;
	}

	public boolean contenien(PeliculaVistaNoSi pvns) throws ClassNotFoundException {

		cargarDatos();
		return gpvns.contains(pvns);
	}

	public PeliculaVistaNoSi getPeliculaVistaNoSi(int id_p, int id_u) throws ClassNotFoundException {
		cargarDatos();
		PeliculaVistaNoSi dev = null;

		for (PeliculaVistaNoSi pvns : gpvns) {
			if (pvns.getId_p() == id_p) {
				if (pvns.getId_u() == id_u) {
					dev = pvns;
				}
			}
		}
		return dev;
	}

	public boolean isId_p(int id_p) throws ClassNotFoundException {

		boolean dev = false;
		cargarDatos();
		for (PeliculaVistaNoSi pvns : gpvns) {
			if (pvns.getId_p() == id_p) {
				dev = true;
			}
		}
		return dev;
	}

	public boolean isId_u(int id_u) throws ClassNotFoundException {
		boolean dev = false;
		cargarDatos();
		for (PeliculaVistaNoSi pvns : gpvns) {
			if (pvns.getId_u() == id_u) {
				dev = true;
			}
		}
		return dev;
	}

	public boolean estaVacia() throws ClassNotFoundException {

		boolean dev = false;
		cargarDatos();
		dev = gpvns.isEmpty();
		return dev;
	}

	public int id_pMasVista() throws ClassNotFoundException {

		cargarDatos();
		int pos = 0;
		int[][] vecesId_p = new int[gpvns.size()][2]; // id_p veces
		for (PeliculaVistaNoSi pvns : gpvns) {
			boolean esta = false;
			if (pvns.isVista()) {
				for (int i = 0; i < pos; i++) {
					if (vecesId_p[i][0] == pvns.getId_p()) {
						vecesId_p[i][1]++;
					}
				}
				if (esta == false) {
					vecesId_p[pos][0] = pvns.getId_p();
					vecesId_p[pos][1]++;
					pos++;
				}
			}
		}
		int dev = vecesId_p[0][0];
		int max = vecesId_p[0][1];
		for (int i = 0; i < pos; i++) {

			if (max <= vecesId_p[i][1]) {
				dev = vecesId_p[i][0];
			}
		}
		return dev;
	}

	public HashSet<ValorId_p> getPeliculasVistaNoSi(int id_u) throws ClassNotFoundException {

		HashSet<ValorId_p> lista = new HashSet<ValorId_p>();
		cargarDatos();
		for (PeliculaVistaNoSi pvns : gpvns) {
			if (pvns.isVista() == false) {
				if (pvns.getId_u() == id_u) {

					lista.add((ValorId_p) pvns);
				}
			}

		}
		return lista;
	}

	public boolean isId_uPen(int id_u) throws ClassNotFoundException {
		boolean dev = false;
		cargarDatos();
		for (PeliculaVistaNoSi pvns : gpvns) {
			if (pvns.getId_u() == id_u) {
				if (pvns.isVista() == false) {
					dev = true;
				}
			}
		}
		return dev;
	}
}